package com.service.impl;

import com.alibaba.druid.util.StringUtils;
import com.dao.UserDao;
import com.dao.impl.UserDaoImpl;
import com.exceptions.MyBaseException;
import com.pojo.TbUser;
import com.service.UserService;
import com.utils.ExcutorsUtils;
import com.utils.MD5Utils;
import com.utils.MailUtils;

import javax.mail.MessagingException;
import java.sql.SQLException;

import java.util.UUID;

public class UserServiceImpl implements UserService {

    private UserDao userDao=new UserDaoImpl();

    @Override
    public void addUser(TbUser user) throws SQLException {
        long currentTimeMillis=System.currentTimeMillis();//开始业务的时间
        //添加数据之前需要先进行校验,比如用户名密码等是否符合我们的要求
        //校验需要规则,比如用户名的规则,密码的规则, 邮箱的规则
        if(!user.getEmail().matches("^[A-Za-z0-9\\.\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$")){
            //邮箱不匹配
            System.err.println("邮箱不符合规则");
            throw new MyBaseException("邮箱不符合规则");


        }
        if(!user.getPassword().matches("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z\\\\W]{6,18}$")){
            //密码不匹配
            System.err.println("密码不符合规则");
            throw new MyBaseException("密码不符合规则");

        }
        String password=user.getPassword();//获取用户名输入的密码

        //计算MD5
        String md5 = MD5Utils.md5(password);//将密码转换成MD5
        user.setPassword(md5);//用户密码变成MD5了
        String code = UUID.randomUUID().toString().replaceAll("-", "");
        user.setCode(code);//我们的账号按照需求需要激活,比如通过邮箱激活,我们必须确认你是真的激活而不会随便点一下就可以,所以我们会要求用户传递一个激活码过来,激活码是我们生成的
        userDao.addUser(user);//保存到数据库
        //激活,发邮件,发送邮件需要时间,下面的代码会进入等待, 导致用户等待,因为这些代码在同一个线程中

        //通过线程池来进行邮件的发送,异步,响应式编程(反应式), DDD领域驱动,真香
        ExcutorsUtils.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    MailUtils.sendMail(user);
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
        });
        System.err.println("总共消耗的时间:"+(System.currentTimeMillis()-currentTimeMillis));

    }

    @Override
    public int active(String username, String code) throws SQLException {
        return userDao.active(username,code);
    }

    @Override
    public TbUser login(String username, String password) throws SQLException {
        //如果连参数都没传递,那么肯定是查不到或者比较错误的,所以在参数不全的情况下,根本没必要请求数据库,以免数据库造成压力
        if(StringUtils.isEmpty(username)||StringUtils.isEmpty(password)){
            return null;

        }
       TbUser tbUser = userDao.findUserByName(username);//查询指定用户名的用户
        if(tbUser==null){//用户名都是空的
            return null;

        }
        //比较密码
        //现在传递的密码是 123456 这种明文, 而数据库中查询出来的是 md5 是无法进行直接比较,需要先将明文转成 MD5
        String md5 = MD5Utils.md5(password);
        if (md5.equals(tbUser.getPassword())){
            //密码一致，说明输入的信息正确
            return tbUser;
        }
        return null;
    }
}
